/**
 * 基于安全签名的自动登录
 *
 * 输入参数:
 *
 * 输出参数:
 *
 */
(() => {
  // 私有区域
  const expires = 3600;   // Token1小时过期

  return function ({ UID, User, Timestamp, Signature, redirect_uri }, headers) {
    // 验证输入参数
    const signKey = A.setting('Login.SignKey');
    if (!signKey) throw Error('登录失败: 未配置签名密钥');
    if (!User) throw Error('登录失败: 缺失用户名参数');
    if (!Timestamp || Math.abs(Date.now() - new Date(Timestamp)) > 5000) throw Error('登录失败: 时间戳错误');

    const real_ip = (headers['X-Real-IP'] || []).join(',');
    const card_用户 = A.card('B.用户');
    const card_登录审计 = A.card('B.登录审计');

    const { rows } = A.db.execute(card_用户.连接名称, "SELECT ID,TY FROM B_YH WHERE YHM=?", [User]);
    if (rows.length === 0) {
      card_登录审计.save({
        用户名: User,
        来源地址: real_ip,
        是否通过: 0
      }, UID);
      throw Error("用户名不存在");
    }
    if (rows[0].TY === 1) {
      card_登录审计.save({
        用户名: User,
        来源地址: real_ip,
        是否通过: 0
      }, UID);
      throw Error("用户已停用");
    }

    // 处理逻辑
    const plain = `signKey=${signKey}&timestamp=${Timestamp}&user=${User}`;
    const md5 = A.crypto.md5(plain);

    if (Signature !== md5) {
      card_登录审计.save({
        用户名: User,
        来源地址: real_ip,
        是否通过: 0
      }, UID);
      throw Error('登录失败: 签名错误');
    }

    // 返回结果
    const token = A.jwt.create({
      UID: rows[0].ID,
      IP: real_ip,
    }, expires);

    card_登录审计.save({
      用户名: User,
      来源地址: real_ip,
      是否通过: 1
    }, UID);

    return { token, expires, redirect_uri };
  };
})()